October 23, 2021
이 문제의 핵심은 기존에 있던 음식을 꺼내고, 새로운 음식을 만들어 넣어도, 다음 차례에 또 스코빌 지수가 가장 작은 음식을 찾아서 꺼내기를 계속 반복해야 한다는 점이다. 즉 계속해서 최솟값을 구해야 한다.
그래서 부모 노드가 항상 자식 노드보다 작은 값을 갖는 힙 (최소 힙) 자료형을 이용하면 엄청 쉽게 풀 수 있다.
파이썬에서는 내장 모듈인 heapq
모듈을 사용하면 리스트를 바로 힙 자료형으로 변환해준다… 짱좋음
import heapq
def solution(scoville, K):
heapq.heapify(scoville) # scoville 리스트를 힙 자료형으로 변환
answer = 0
while len(scoville) > 1:
if scoville[0] >= K:
return answer
# heappop()을 통해 가장 작은 값을 2번 뽑기
first = heapq.heappop(scoville)
second = heapq.heappop(scoville)
new = first + second**2
# heappush()를 통해 새로운 값을 넣으면 heap 자료형을 유지할 수 있다
heapq.heappush(scoville, new)
answer += 1
return -1